package cn.it58.gooditname.settings

import cn.it58.gooditname.services.UpdateService
import cn.it58.gooditname.services.VersionService
import com.intellij.ide.BrowserUtil
import java.awt.BorderLayout
import java.awt.GridBagConstraints
import java.awt.GridBagLayout
import java.awt.Insets
import javax.swing.*

/**
 * GoodName 设置面板
 */
class GoodItNameSettingsPanel {

    val mainPanel: JPanel = JPanel(BorderLayout())
    private val apiKeyField = JTextField(30)
    private val aiModelField = JTextField(30)
    private val enableApiCheckBox = JCheckBox("启用 AI 翻译", true)
    private val fallbackLocalCheckBox = JCheckBox("启用本地词典回退", true)

    /**
     * API 密钥
     */
    var apiKey: String
        get() = apiKeyField.text ?: ""
        set(value) { apiKeyField.text = value }

    /**
     * AI 模型
     */
    var aiModel: String
        get() = aiModelField.text ?: "Qwen/Qwen2.5-7B-Instruct"
        set(value) { aiModelField.text = value }

    /**
     * 是否启用 API
     */
    var isApiEnabled: Boolean
        get() = enableApiCheckBox.isSelected
        set(value) { enableApiCheckBox.isSelected = value }

    /**
     * 是否启用本地回退
     */
    var isFallbackLocalEnabled: Boolean
        get() = fallbackLocalCheckBox.isSelected
        set(value) { fallbackLocalCheckBox.isSelected = value }

    init {
        createUI()
    }

    private fun createUI() {
        val formPanel = JPanel(GridBagLayout())
        val gbc = GridBagConstraints()

        // 标题
        gbc.gridx = 0
        gbc.gridy = 0
        gbc.gridwidth = 2
        gbc.insets = Insets(0, 0, 20, 0)
        gbc.anchor = GridBagConstraints.WEST
        formPanel.add(JLabel("<html><h2>GoodName 配置</h2></html>"), gbc)

        // API 密钥标签
        gbc.gridx = 0
        gbc.gridy = 1
        gbc.gridwidth = 1
        gbc.insets = Insets(5, 0, 5, 10)
        gbc.anchor = GridBagConstraints.WEST
        formPanel.add(JLabel("API 密钥:"), gbc)

        // API 密钥输入框
        gbc.gridx = 1
        gbc.gridy = 1
        gbc.fill = GridBagConstraints.HORIZONTAL
        gbc.weightx = 1.0
        formPanel.add(apiKeyField, gbc)

        // AI 模型标签
        gbc.gridx = 0
        gbc.gridy = 2
        gbc.fill = GridBagConstraints.NONE
        gbc.weightx = 0.0
        formPanel.add(JLabel("AI 模型:"), gbc)

        // AI 模型输入框和推荐按钮面板
        val modelPanel = JPanel(BorderLayout())
        aiModelField.text = "Qwen/Qwen2.5-7B-Instruct"  // 设置默认值
        modelPanel.add(aiModelField, BorderLayout.CENTER)
        
        // 推荐模型按钮
        val recommendButton = JButton("🆓 免费推荐")
        recommendButton.toolTipText = "点击使用免费推荐模型"
        recommendButton.addActionListener {
            aiModelField.text = "Qwen/Qwen2.5-7B-Instruct"
        }
        modelPanel.add(recommendButton, BorderLayout.EAST)
        
        gbc.gridx = 1
        gbc.gridy = 2
        gbc.fill = GridBagConstraints.HORIZONTAL
        gbc.weightx = 1.0
        formPanel.add(modelPanel, gbc)

        // 启用 API 复选框
        gbc.gridx = 0
        gbc.gridy = 3
        gbc.gridwidth = 2
        gbc.insets = Insets(15, 0, 5, 0)
        formPanel.add(enableApiCheckBox, gbc)

        // 启用本地回退复选框
        gbc.gridx = 0
        gbc.gridy = 4
        gbc.gridwidth = 2
        gbc.insets = Insets(5, 0, 5, 0)
        formPanel.add(fallbackLocalCheckBox, gbc)

        // 检测更新按钮
        val updateButton = JButton("🔄 检测更新")
        updateButton.addActionListener {
            checkForUpdates()
        }
        gbc.gridx = 0
        gbc.gridy = 5
        gbc.gridwidth = 2
        gbc.insets = Insets(15, 0, 5, 0)
        formPanel.add(updateButton, gbc)

        // 说明文本
        gbc.gridx = 0
        gbc.gridy = 6
        gbc.gridwidth = 2
        gbc.insets = Insets(20, 0, 0, 0)
        gbc.fill = GridBagConstraints.BOTH
        gbc.weightx = 1.0
        gbc.weighty = 1.0
        
        val helpText = JTextArea()
        helpText.text = """
            配置说明：
            
            1. API 密钥：可选配置轨迹流动 (SiliconFlow) 的 API 密钥
               - 获取地址：https://siliconflow.cn
               - 注册后即可获得免费额度
               
            2. AI 模型：可以自由输入任何支持的 AI 翻译模型
               - 🆓 推荐免费模型：Qwen/Qwen2.5-7B-Instruct（免费、快速、质量高）
               - 也可使用：deepseek-ai/DeepSeek-V2.5、01-ai/Yi-1.5-34B-Chat 等
               
            3. 启用 AI 翻译：开启后将优先使用 AI 翻译
               - 需要配置有效的 API 密钥
               
            4. 启用本地词典回退：当 AI 翻译失败时自动使用本地词典
               - 建议保持开启以确保插件可用性
               
            即使不配置 API 密钥，插件也能正常工作（使用本地词典）。
        """.trimIndent()
        
        helpText.isEditable = false
        helpText.isOpaque = false
        helpText.lineWrap = true
        helpText.wrapStyleWord = true
        helpText.font = helpText.font.deriveFont(12f)
        
        val scrollPane = JScrollPane(helpText)
        scrollPane.border = BorderFactory.createTitledBorder("使用说明")
        formPanel.add(scrollPane, gbc)

        mainPanel.add(formPanel, BorderLayout.CENTER)
    }

    /**
     * 检测更新
     */
    private fun checkForUpdates() {
        SwingUtilities.invokeLater {
            val button = mainPanel.components
                .filterIsInstance<JPanel>().first()
                .components.filterIsInstance<JButton>()
                .find { it.text == "🔄 检测更新" }
            
            button?.text = "🔄 检测中..."
            button?.isEnabled = false
            
            // 在后台线程中执行网络请求
            Thread {
                try {
                    val updateService = UpdateService()
                    val updateInfo = updateService.checkForUpdates()
                    
                    SwingUtilities.invokeLater {
                        button?.text = "🔄 检测更新"
                        button?.isEnabled = true
                        
                        if (updateInfo != null) {
                            val currentVersion = VersionService.getCurrentVersion()
                            val hasUpdate = VersionService.hasNewVersion(updateInfo.latestVersion)
                            
                            if (hasUpdate) {
                                // 有新版本，显示更新对话框
                                showUpdateDialog(updateInfo, currentVersion)
                            } else {
                                // 无新版本，显示常规信息
                                val message = buildString {
                                    append("📢 公告：${updateInfo.announcement}\n\n")
                                    append("🔖 当前版本：${currentVersion}\n")
                                    append("🆕 最新版本：${updateInfo.latestVersion}\n")
                                    append("📝 版本说明：${updateInfo.description}\n\n")
                                    append("✅ 当前已是最新版本")
                                }
                                
                                JOptionPane.showMessageDialog(
                                    mainPanel,
                                    message,
                                    "GoodName 更新信息",
                                    JOptionPane.INFORMATION_MESSAGE
                                )
                            }
                        } else {
                            JOptionPane.showMessageDialog(
                                mainPanel,
                                "🔍 检测更新失败，请检查网络连接",
                                "GoodName 更新检测",
                                JOptionPane.WARNING_MESSAGE
                            )
                        }
                    }
                } catch (e: Exception) {
                    SwingUtilities.invokeLater {
                        button?.text = "🔄 检测更新"
                        button?.isEnabled = true
                        
                        JOptionPane.showMessageDialog(
                            mainPanel,
                            "❌ 检测更新时发生错误：${e.message}",
                            "GoodName 更新检测",
                            JOptionPane.ERROR_MESSAGE
                        )
                    }
                }
            }.start()
        }
    }
    
    /**
     * 显示更新对话框
     */
    private fun showUpdateDialog(updateInfo: cn.it58.gooditname.services.UpdateInfo, currentVersion: String) {
        val message = buildString {
            append("🎉 发现新版本！\n\n")
            append("📢 公告：${updateInfo.announcement}\n\n")
            append("🔖 当前版本：${currentVersion}\n")
            append("🆕 最新版本：${updateInfo.latestVersion}\n")
            append("📝 更新说明：${updateInfo.description}\n\n")
            append("💡 建议立即更新以获得最新功能和修复！")
        }
        
        val options = arrayOf("🔄 前往更新", "📋 查看详情", "⏰ 稍后再说")
        
        val choice = JOptionPane.showOptionDialog(
            mainPanel,
            message,
            "🆕 GoodName 发现新版本",
            JOptionPane.YES_NO_CANCEL_OPTION,
            JOptionPane.INFORMATION_MESSAGE,
            null,
            options,
            options[0]
        )
        
        when (choice) {
            0 -> { // 前往更新
                val pluginMarketUrl = "jetbrains://idea/plugins/page?id=cn.it58.goodname"
                BrowserUtil.browse(pluginMarketUrl)
            }
            1 -> { // 查看详情
                val detailMessage = """
                    🎯 GoodName 更新详情
                    
                    📢 最新公告：${updateInfo.announcement}
                    
                    📊 版本对比：
                    • 当前版本：${currentVersion}
                    • 最新版本：${updateInfo.latestVersion}
                    
                    📝 更新内容：${updateInfo.description}
                    
                    🚀 更新方式：
                    1. 点击"前往更新"按钮可直接跳转到插件市场
                    2. 或手动访问：File → Settings → Plugins → 搜索"GoodName"
                    3. 点击插件页面的"Update"按钮即可更新
                    
                    💡 建议及时更新以获得最佳使用体验！
                """.trimIndent()
                
                JOptionPane.showMessageDialog(
                    mainPanel,
                    detailMessage,
                    "GoodName 更新详情",
                    JOptionPane.INFORMATION_MESSAGE
                )
            }
            2 -> { // 稍后再说
                // 用户选择稍后，不做任何操作
            }
        }
    }
} 